package cn.edu.xjtu.carlWay.stackAndQueue.nextGreaterElementII;

import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;

/**
 * @author Hydrion-QLz
 * @date 2022-05-05 9:46
 * @description https://leetcode-cn.com/problems/next-greater-element-ii/
 * <p>
 * 503. 下一个更大元素 II
 * 给定一个循环数组 nums （ nums[nums.length - 1] 的下一个元素是 nums[0] ），返回 nums 中每个元素的 下一个更大元素 。
 * <p>
 * 数字 x 的 下一个更大的元素 是按数组遍历顺序，这个数字之后的第一个比它更大的数，这意味着你应该循环地搜索它的下一个更大的数。如果不存在，则输出 -1 。
 */
class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int n = nums.length;
        int[] res = new int[n];
        Arrays.fill(res, -1);
        Deque<Integer> stack = new LinkedList<>();
        for (int i = 0; i < 2 * n; i++) {
            while (!stack.isEmpty() && nums[i % n] > nums[stack.peekLast()]) {
                int idx = stack.removeLast();
                res[idx] = nums[i % n];
            }
            stack.addLast(i % n);
        }
        return res;
    }
}